﻿Public Class frm_cambio

    Dim accesoDatosVenta As New AccesoDatos("Venta")
    Dim accesoDatosPagos As New AccesoDatos("Pagos")
    Dim accesoDatosDV As New AccesoDatos("DetalleVenta")
    Dim accesoDatosNC As New AccesoDatos("NotaCredito")
    Dim nuevoMonto As Double
    Dim contadorItems As Integer = -1
    Dim items(50) As String

    Dim esCambio As Boolean = False

    Private Sub cmd_buscarVenta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_buscarVenta.Click

        For i As Integer = 0 To dgv_detalles.RowCount - 1
            dgv_detalles.Rows.Remove(dgv_detalles.Rows(0))
        Next
        Dim buscarVenta As String

        Dim tablaVenta As New Data.DataTable
        Dim anulada As Integer
        Dim tablaDetalles As New Data.DataTable
        Dim buscarDetalles As String
        Dim tablaPagos As New Data.DataTable
        Dim buscarPagos As String
        buscarPagos = "SELECT tp.nombre AS 'Forma Pago', p.Monto  FROM  Venta AS v INNER JOIN  Pagos AS p ON v.idVenta = p.idVenta INNER JOIN  TipoPago AS tp ON tp.idTipoPago = p.idTipoPago Where v.idVenta = " & txt_idVenta.Text

        If Not IsNumeric(txt_idVenta.Text) Then
            MessageBox.Show("Ingrese un Id de Venta numérico", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            txt_idVenta.Text = ""
            txt_idVenta.Focus()
        Else
            If txt_idVenta.Text = "" Then
                MessageBox.Show("No ha ingresado ninguna venta", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                txt_idVenta.Focus()
            Else
                buscarVenta = "select e.nombre, e.apellido, v.* from Venta v INNER JOIN Empleado e ON e.idEmpleado = v.idEmpleado where v.idVenta = " & txt_idVenta.Text & " and v.esAnulada = 0"
                buscarDetalles = "SELECT dv.idItem ,dv.cantidad AS 'Cantidad', dv.idProducto AS 'ID', p.descripcion as 'Descripcion', p.precioVenta as 'Precio Unitario', tt.idTalle as 'Talle', tt.nombre as 'NombreTalle', (dv.cantidad * p.precioVenta) as 'Importe', TipoProd.nombre AS 'TipoPrducto', TipoTela.nombre as 'Tela' FROM   Venta AS v INNER JOIN  DetalleVenta AS dv ON dv.idVenta = v.idVenta INNER JOIN  Producto AS p ON p.idProducto = dv.idProducto INNER JOIN  Talle_Producto AS tp ON tp.idProducto = dv.idProducto and tp.idTalle = dv.idTalle INNER JOIN  Talle AS tt ON tt.idTalle = tp.idTalle INNER JOIN TipoProd ON TipoProd.idTipoProd = p.idTipoProd INNER JOIN TipoTela ON TipoTela.idTipoTela = p.idTipoTela WHERE v.idVenta = " & txt_idVenta.Text

                tablaVenta = accesoDatosVenta.consulta(buscarVenta)

                If tablaVenta.Rows.Count = 0 Then
                    MessageBox.Show("El id de venta ingresado no corresponde a una venta vigente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
                    txt_idVenta.Focus()
                Else
                    txt_fechaVenta.Text = tablaVenta.Rows(0)("fecha")
                    txt_montoVenta.Text = tablaVenta.Rows(0)("montoTotal")
                    anulada = tablaVenta.Rows(0)("esAnulada")
                    If anulada = 0 Then
                        txt_estadoVenta.Text = "Vigente"
                    Else
                        txt_estadoVenta.Text = "Anulada"
                    End If
                    txt_empleadoVEnta.Text = tablaVenta.Rows(0)("nombre") + " " + tablaVenta.Rows(0)("apellido")

                    tablaDetalles = accesoDatosVenta.consulta(buscarDetalles)

                    Dim descrip As String = ""
                    For i = 0 To tablaDetalles.Rows.Count - 1
                        descrip = tablaDetalles.Rows(i)("TipoPrducto") + " " + tablaDetalles.Rows(i)("Tela") + tablaDetalles.Rows(i)("Descripcion") + " Talle: " + tablaDetalles.Rows(i)("NombreTalle")
                    Next

                    For i As Integer = 0 To tablaDetalles.Rows.Count - 1
                        dgv_detalles.Rows.Add()
                        dgv_detalles.Item("Cantidad".ToLower, i).Value = tablaDetalles.Rows(i)("Cantidad")
                        dgv_detalles.Item("Id".ToLower, i).Value = tablaDetalles.Rows(i)("ID")
                        dgv_detalles.Item("Descripcion".ToLower, i).Value = descrip
                        dgv_detalles.Item("precioUnitario".ToLower, i).Value = tablaDetalles.Rows(i)("Precio Unitario")
                        dgv_detalles.Item("importe".ToLower, i).Value = tablaDetalles.Rows(i)("Importe")
                        dgv_detalles.Item("idTalle".ToLower, i).Value = tablaDetalles.Rows(i)("Talle")
                        dgv_detalles.Item("idItem".ToLower, i).Value = tablaDetalles.Rows(i)("idItem")
                    Next
                    tablaPagos = accesoDatosVenta.consulta(buscarPagos)
                    dgv_Pagos.DataSource = tablaPagos
                    txt_idVenta.ReadOnly = True
                End If
            End If
        End If
    End Sub


    Public Sub realizarCambio(ByVal grillaCambio As DataGridView)
        Me.Show()
        If CStr(dgv_detalles.CurrentRow.Cells("idItem").Value) <> "" Then
            contadorItems = contadorItems + 1
            items(contadorItems) = dgv_detalles.CurrentRow.Cells("idItem").Value
        End If

        dgv_detalles.Rows.Remove(dgv_detalles.CurrentRow)

        Dim talle As String
        Dim idProductos As String
        Dim cant As String
        Dim descripcion As String
        Dim precioUnitario As String
        Dim importe As String


        For i As Integer = 0 To grillaCambio.RowCount - 1
            idProductos = CStr(grillaCambio.Item("Id".ToLower, i).Value)
            cant = CStr(grillaCambio.Item("Cantidad".ToLower, i).Value)
            talle = CStr(grillaCambio.Item("idTalle".ToLower, i).Value)
            descripcion = CStr(grillaCambio.Item("Descripcion".ToLower, i).Value)
            precioUnitario = CStr(grillaCambio.Item("PrecioUnitario".ToLower, i).Value)
            importe = CStr(grillaCambio.Item("Importe".ToLower, i).Value)

            dgv_detalles.Rows.Add(Nothing, Nothing, cant, idProductos, descripcion, precioUnitario, importe, talle)
        Next
        frm_buscarProdCambio.Close()
        cmd_confirmarCambio.Enabled = True


    End Sub


    Private Sub dgv_detalles_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_detalles.CellClick
        If dgv_detalles.Columns(e.ColumnIndex).Name = "Cambio" Then
            Me.Hide()
            frm_buscarProdCambio.Show()
        ElseIf dgv_detalles.Columns(e.ColumnIndex).Name = "devolucion" Then
            If dgv_detalles.CurrentRow.DefaultCellStyle.BackColor = Color.LightBlue Then
                dgv_detalles.CurrentRow.DefaultCellStyle.BackColor = Color.White
            Else
                dgv_detalles.CurrentRow.DefaultCellStyle.BackColor = Color.LightBlue
                cmd_confirmarCambio.Enabled = True
            End If
        End If
    End Sub

    Private Sub frm_cambio_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If MessageBox.Show("¿Está seguro que desea salir?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            e.Cancel = False
            frm_menu.Show()
        Else
            e.Cancel = True
        End If
    End Sub


    Private Sub cmd_confirmarCambio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_confirmarCambio.Click
        If esCambio = True Then
            For i As Integer = 0 To dgv_detalles.RowCount - 1
                nuevoMonto = nuevoMonto + CDbl((dgv_detalles.Item("Importe".ToLower, i).Value))
            Next
            If nuevoMonto > CDbl(txt_montoVenta.Text) Then
                frm_tipoPago.Show()
                frm_tipoPago._esCambio = True
                frm_tipoPago.cargarMonto(nuevoMonto - CDbl(txt_montoVenta.Text))

            ElseIf nuevoMonto < CDbl(txt_montoVenta.Text) Then
                confirmarCambioMontoMenor()

            Else
                confirmarCambioMontoIgual()
            End If
        Else
            confirmarDevolucion()

        End If

        'MessageBox.Show("Cambio realizado con éxito.", "Destroy", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub confirmarDevolucion()
        Dim importeNotaCredito As Double
        Dim tablaIdNotaCredito As New Data.DataTable


        For i As Integer = 0 To dgv_detalles.RowCount - 1
            If dgv_detalles.Rows(i).DefaultCellStyle.BackColor = Color.LightBlue Then
                importeNotaCredito = importeNotaCredito + CDbl(dgv_detalles.Rows(i).Cells("Importe").Value)
            End If
        Next

        Dim valoresNC As String = "fecha =" & Date.Today & ",monto =" & importeNotaCredito
        accesoDatosNC.insertar(True, valoresNC)

        tablaIdNotaCredito = accesoDatosNC.consulta("SELECT MAX(idNotaCredito) from NotaCredito")

        Dim consultaActualizarItem As String
        Dim idProd As String
        Dim cant As String
        Dim idTalle As String

        For i As Integer = 0 To dgv_detalles.RowCount - 1
            If dgv_detalles.Rows(i).DefaultCellStyle.BackColor = Color.LightBlue Then
                consultaActualizarItem = "UPDATE DetalleVenta SET idNotaCredito = " & tablaIdNotaCredito.Rows(0)(0) & " WHERE idItem = " & dgv_detalles.Rows(i).Cells("idItem").Value
                accesoDatosDV.consultaSinReturn(consultaActualizarItem)
                idProd = dgv_detalles.Rows(i).Cells("Id").Value
                cant = dgv_detalles.Rows(i).Cells("Cantidad").Value
                idTalle = dgv_detalles.Rows(i).Cells("idTalle").Value
                accesoDatosDV.actualizarStockCompra(idProd, idTalle, cant)
            End If
        Next

        MessageBox.Show("Devolución realizada con éxito.", "Destroy", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub confirmarCambioMontoIgual()
        Dim idProd As String
        Dim cantidad As String
        Dim idTalle As String

        Dim consultaObtenerProducto As String
        Dim tablaDetalle As Data.DataTable

        For i = 0 To items.Length - 1
            If items(i) <> Nothing Then

                consultaObtenerProducto = "Select dv.* from DetalleVenta dv Where idItem = " & items(i) & " AND idVenta = " & txt_idVenta.Text
                tablaDetalle = accesoDatosDV.consulta(consultaObtenerProducto)

                idProd = CStr(tablaDetalle.Rows(0)("idProducto"))
                idTalle = CStr(tablaDetalle.Rows(0)("idTalle"))
                cantidad = CStr(tablaDetalle.Rows(0)("cantidad"))
                accesoDatosDV.actualizarStockCompra(idProd, idTalle, cantidad)

                accesoDatosDV.eliminar("idItem", items(i), "idVenta", txt_idVenta.Text)
            End If
        Next


        For i = 0 To dgv_detalles.Rows.Count - 1

            If dgv_detalles.Rows(i).Cells("idItem").Value = Nothing Then
                accesoDatosDV.insertar(True, generarStringInsertDetalles(txt_idVenta.Text, dgv_detalles.Rows(i).Cells("id").Value, dgv_detalles.Rows(i).Cells("idTalle").Value, dgv_detalles.Rows(i).Cells("cantidad").Value))
                accesoDatosDV.actualizarStockVenta(dgv_detalles.Rows(i).Cells("id").Value, dgv_detalles.Rows(i).Cells("idTalle").Value, dgv_detalles.Rows(i).Cells("cantidad").Value)
            End If
        Next
    End Sub

    Private Sub confirmarCambioMontoMenor()

        Dim diferencia As Double = CDbl(txt_montoVenta.Text) - nuevoMonto
        Dim valoresNota As String = "fecha =" & Date.Today & ", monto=" & diferencia
        accesoDatosNC.insertar(True, valoresNota)
        Dim idNotaCredito As New Data.DataTable
        idNotaCredito = accesoDatosNC.consulta("SELECT MAX(idNotaCredito) from NotaCredito")


        Dim idProd As String
        Dim cantidad As String
        Dim idTalle As String

        Dim consultaObtenerProducto As String
        Dim tablaDetalle As Data.DataTable

        For i = 0 To items.Length - 1
            If items(i) <> Nothing Then
                Dim consultaActualizarItem As String = "UPDATE DetalleVenta SET idNotaCredito = " & idNotaCredito.Rows(0)(0) & " WHERE idItem = " & items(i)
                accesoDatosDV.consultaSinReturn(consultaActualizarItem)
                consultaObtenerProducto = "Select dv.* from DetalleVenta dv Where idItem = " & items(i) & " AND idVenta = " & txt_idVenta.Text

                tablaDetalle = accesoDatosDV.consulta(consultaObtenerProducto)

                idProd = CStr(tablaDetalle.Rows(0)("idProducto"))
                idTalle = CStr(tablaDetalle.Rows(0)("idTalle"))
                cantidad = CStr(tablaDetalle.Rows(0)("cantidad"))
                accesoDatosDV.actualizarStockCompra(idProd, idTalle, cantidad)

                accesoDatosDV.eliminar("idItem", items(i), "idVenta", txt_idVenta.Text)
            End If
        Next


        For i = 0 To dgv_detalles.Rows.Count - 1

            If dgv_detalles.Rows(i).Cells("idItem").Value = Nothing Then
                accesoDatosDV.insertar(True, generarStringInsertDetalles(txt_idVenta.Text, dgv_detalles.Rows(i).Cells("id").Value, dgv_detalles.Rows(i).Cells("idTalle").Value, dgv_detalles.Rows(i).Cells("cantidad").Value))
                accesoDatosDV.actualizarStockVenta(dgv_detalles.Rows(i).Cells("id").Value, dgv_detalles.Rows(i).Cells("idTalle").Value, dgv_detalles.Rows(i).Cells("cantidad").Value)
            End If
        Next


    End Sub


    Private Function generarStringUpdateAnulacionVenta() As String
        Dim tabla As New Data.DataTable
        tabla = accesoDatosVenta.consulta("select * from Venta where idVenta = " & txt_idVenta.Text)

        Dim fecha As String = tabla.Rows(0)("fecha")
        Dim montoTotal As Integer = tabla.Rows(0)("montoTotal")
        Dim esAnulada As Integer = 1
        Dim empleado As String = tabla.Rows(0)("idEmpleado")

        Dim valores As String = "fecha =" & fecha
        valores &= ", montoTotal =" & montoTotal
        valores &= ", esAnulada =" & esAnulada
        valores &= ", idEmpleado =" & empleado

        Return valores
    End Function

    Private Function generarStringInsertVenta() As String
        Dim venta As String
        venta = "fecha =" & Date.Today & ", montoTotal =" & nuevoMonto & ", esAnulada =0, idEmpleado =2"
        Return venta
    End Function

    Private Function generarRestriccionUpdate(ByVal campo As String, ByRef valor As String) As String
        Dim restriccion As String
        restriccion = campo & " = " & valor
        Return restriccion
    End Function

    Private Sub cmd_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_cancelar.Click
        txt_empleadoVEnta.Text = ""
        txt_estadoVenta.Text = ""
        txt_fechaVenta.Text = ""
        txt_idVenta.Text = ""
        txt_montoVenta.Text = ""
        dgv_Pagos.DataSource = Nothing
        For i As Integer = 0 To dgv_detalles.RowCount - 1
            dgv_detalles.Rows.Remove(dgv_detalles.Rows(0))
        Next
        cmd_confirmarCambio.Enabled = False
        txt_idVenta.ReadOnly = False
        txt_idVenta.Focus()

    End Sub

    Private Sub frm_cambio_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       
    End Sub

    Public Sub cargarForm(ByVal esCamb As Boolean)
        If esCamb = True Then
            esCambio = True
            cmd_confirmarCambio.Enabled = False
            dgv_detalles.Columns("Cambio").Visible = True
            dgv_detalles.Columns("Devolucion").Visible = False
            Me.Text = "Cambio"
        Else
            cmd_confirmarCambio.Enabled = False
            dgv_detalles.Columns("Cambio").Visible = False
            dgv_detalles.Columns("Devolucion").Visible = True
            Me.Text = "Devolución"
        End If
    End Sub

    Public Sub confirmarCambioMontoMayor(ByRef grillaPagos As DataGridView)
        Dim tablaPagos As New Data.DataTable
        Dim buscarPagos As String
        Dim tablaMayorId As New Data.DataTable
        Dim buscarMayorId As String


        Dim tipoPago As String
        Dim idTarjeta As String
        Dim nroAutorizacion As String
        Dim montoNuevo As String

        Dim idProductos As String
        Dim cant As String
        Dim talle As String

        anularVenta(txt_idVenta.Text)
        actualizarStockCambioMontoMayor(txt_idVenta.Text)



        accesoDatosVenta.insertar(True, generarStringInsertVenta())
        buscarPagos = "SELECT p.* FROM  Venta AS v INNER JOIN  Pagos AS p ON v.idVenta = p.idVenta Where v.idVenta = " & txt_idVenta.Text
        tablaPagos = accesoDatosVenta.consulta(buscarPagos)
        buscarMayorId = "select MAX(v.idVenta) from Venta v"

        tablaMayorId = accesoDatosVenta.consulta(buscarMayorId)

        Dim idVenta As String = tablaMayorId.Rows(0)(0)

        For i As Integer = 0 To tablaPagos.Rows.Count = -1
            tipoPago = tablaPagos.Rows(0)("idTipoPago")
            If IsDBNull(tablaPagos.Rows(0)("idTarjeta")) Then
                idTarjeta = "Null"
                nroAutorizacion = "Null"
            Else
                idTarjeta = tablaPagos.Rows(0)("idTarjeta")
                nroAutorizacion = tablaPagos.Rows(0)("nroAutorizacion")
            End If
            montoNuevo = tablaPagos.Rows(0)("Monto")
            accesoDatosPagos.insertar(True, generarStringInsertPagos(idVenta, tipoPago, idTarjeta, nroAutorizacion, montoNuevo))
        Next

        For i As Integer = 0 To grillaPagos.RowCount - 1
            tipoPago = CStr(grillaPagos.Item("idTipo".ToLower, i).Value)
            idTarjeta = CStr(grillaPagos.Item("idTarjeta".ToLower, i).Value)
            montoNuevo = CStr(grillaPagos.Item("Monto".ToLower, i).Value)
            nroAutorizacion = CStr(grillaPagos.Item("nroAuto".ToLower, i).Value)
            accesoDatosPagos.insertar(True, generarStringInsertPagos(idVenta, tipoPago, idTarjeta, nroAutorizacion, montoNuevo))
        Next

        For i As Integer = 0 To dgv_detalles.RowCount - 1
            idProductos = CStr(dgv_detalles.Item("Id".ToLower, i).Value)
            cant = CStr(dgv_detalles.Item("Cantidad".ToLower, i).Value)
            talle = CStr(dgv_detalles.Item("idTalle".ToLower, i).Value)
            accesoDatosDV.insertar(True, generarStringInsertDetalles(idVenta, idProductos, talle, cant))
            accesoDatosDV.actualizarStockVenta(idProductos, talle, cant)
        Next
        Me.Close()
    End Sub

    Private Sub actualizarStockCambioMontoMayor(ByVal idVenta As String)
        Dim consul As String
        Dim idProductos As String
        Dim cant As String
        Dim talle As String

        Dim tablaDetalles As New Data.DataTable
        consul = "select * from DetalleVenta Where idVenta = " & idVenta
        tablaDetalles = accesoDatosDV.consulta(consul)

        For i As Integer = 0 To tablaDetalles.Rows.Count - 1
            idProductos = CStr(tablaDetalles.Rows(i)("idProducto".ToLower))
            cant = CStr(tablaDetalles.Rows(i)("cantidad".ToLower))
            talle = CStr(tablaDetalles.Rows(i)("idTalle".ToLower))

            accesoDatosDV.actualizarStockCompra(idProductos, talle, cant)

        Next

    End Sub

    Private Function generarStringInsertDetalles(ByVal idventa As String, ByVal idProducto As String, ByVal idTalle As String, ByVal cantidad As String) As String
        Dim valores As String

        valores = "idVenta =" & idventa & ", idProducto =" & idProducto
        valores &= ", idTalle =" & idTalle & ", cantidad =" & cantidad

        Return valores
    End Function

    Private Function generarStringInsertPagos(ByVal idventa As String, ByVal idTipoPago As String, ByVal idTarjeta As String, ByVal nroAutorizacion As String, ByVal monto As String) As String
        Dim valores As String

        Dim tarjeta As String
        Dim autorizacion As String
        If idTarjeta = "" Then
            tarjeta = "Null"
            autorizacion = "Null"
        Else
            tarjeta = idTarjeta
            autorizacion = nroAutorizacion
        End If
        valores = "idVenta =" & idventa & ", idTipoPago =" & idTipoPago
        valores &= ", idTarjeta =" & tarjeta & ", nroAutorizacion =" & autorizacion
        valores &= ", monto =" & monto

        Return valores
    End Function
    Private Sub anularVenta(ByVal idVenta As String)
        accesoDatosVenta.Modificar(True, generarStringUpdateAnulacionVenta(), generarRestriccionUpdate("idVenta", txt_idVenta.Text))
    End Sub

   
    Private Sub cmd_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_salir.Click
        Me.Close()
    End Sub
End Class